//
//  main.m
//  GCD的使用
//
//  Created by 曾泽昱 on 2024/7/16.
//

#import <Foundation/Foundation.h>



int main(int argc, const char * argv[]) {
    //        //init方式创建，需要手动开启
    //        NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:() object:@"NSThread1"];
    //        // 手动开启
    //        [thread1 start];
    //
    //        //创建后自动启动
    //        [NSThread detachNewThreadSelector:<#(nonnull SEL)#> toTarget:self withObject:@"NSThread2"];
    //
    //
    //        /** 方法三，隐式创建，直接启动 */
    //        [self performSelectorInBackground:@selector(doSomething3:) withObject:@"NSThread3"];

    //GCD
    //1.创建
    //串行队列
    dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);
    //并发队列
    dispatch_queue_t queue1 = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        //耗时操作放在这里
        
    });
    dispatch_async(dispatch_get_main_queue(), ^{
        //回到主线程进行UI操作
        
    });
    
    //全局并发队列：全局并发队列就是一个并发队列，是为了让我们更方便的使用多线程。dispatch_get_global_queue(0,0);
    dispatch_queue_global_t queue3 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //全局并发队列的优先级
    #define DISPATCH_QUEUE_PRIORITY_HIGH 2               //高优先级
    #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0            //默认（中）优先级
    #define DISPATCH_QUEUE_PRIORITY_LOW (-2)             //低优先级
    #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN //后台优先级
    //iOS8开始使用服务质量，现在获取全局并发队列时，可以直接传0
    //dispatch_get_global_queue(0, 0);
    
    //同步/异步创建方法
//    同步（sync）使用dispatch_sync来表示。
//    异步（async）使用dispatch_async。
    //同步执行任务
//    dispatch_sync(dispatch_get_global_queue(0, 0), ^{
//        NSLog(@"我是同步执行的任务");
//    });
//    dispatch_async(dispatch_get_global_queue(0, 0), ^{
//        NSLog(@"我是异步执行的任务");
//    });
//   
    
//    //串行同步 DISPATCH_QUEUE_SERIAL
//    //串行队列
//    dispatch_queue_t queue4 = dispatch_queue_create("test",DISPATCH_QUEUE_SERIAL);
//    
//    //同步执行
//    dispatch_sync(queue4, ^{
//        for(int i = 0; i < 3; ++i){
//            NSLog(@"串行同步1  %@",[NSThread currentThread]);
//        }
//    });
//    dispatch_sync(queue4, ^{
//        for(int i = 0; i < 3; ++i){
//            NSLog(@"串行同步2  %@",[NSThread currentThread]);
//        }
//    });
//    dispatch_sync(queue4, ^{
//        for(int i = 0; i < 3; ++i){
//            NSLog(@"串行同步3  %@",[NSThread currentThread]);
//        }
//    });
    
//    //串行队列
//    dispatch_queue_t queue5 = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);
//
//    //异步执行
//    dispatch_async(queue5, ^{
//        for (int i = 0; i < 3; i++) {
//           NSLog(@"串行异步1   %@",[NSThread currentThread]);
//        }
//    });
//    dispatch_async(queue5, ^{
//        for (int i = 0; i < 3; i++) {
//           NSLog(@"串行异步2   %@",[NSThread currentThread]);
//        }
//    });
//    dispatch_async(queue5, ^{
//        for (int i = 0; i < 3; i++) {
//           NSLog(@"串行异步3   %@",[NSThread currentThread]);
//        }
//    });
//    dispatch_sync(queue5, ^{
//        for(int i = 0; i < 3; ++i){
//            NSLog(@"串行同步1  %@",[NSThread currentThread]);
//        }
//    });
    
    NSLog(@"串行同步1  %@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:2];
    NSLog(@"串行同步1  %@",[NSThread currentThread]);
    [NSThread sleepForTimeInterval:2];
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    return 0;
}
